unit ContaMovimentacaoDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, ZSqlUpdate, ZSequence, MainDM, QueryConditions, DB;

type

  { TContaMovimentacaoData }

  TContaMovimentacaoData = class(TMainDataModule)
    ContaMovimentacaoDatasource: TDatasource;
    ContaMovimentacaoZQuerydata: TDateField;
    ContaMovimentacaoZQuerydesc_plano_conta: TStringField;
    ContaMovimentacaoZQueryhora: TTimeField;
    ContaMovimentacaoZQueryid_caixa_movimentacao: TLargeintField;
    ContaMovimentacaoZQueryid_conta: TLargeintField;
    ContaMovimentacaoZQueryid_plano_conta: TLargeintField;
    ContaMovimentacaoZQueryid_plano_conta_movimentacao: TLargeintField;
    ContaMovimentacaoZQueryid_usuario: TLargeintField;
    ContaMovimentacaoZQuerytipo: TStringField;
    ContaMovimentacaoZQueryvalor: TFloatField;
    ContaMovimentacaoZSequence: TZSequence;
    ContaMovimentacaoZUpdate: TZUpdateSQL;
    ContaMovimentacaoZQuery: TZQuery;
    AuxiliarZQuery: TZQuery;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    function BuscaData(): string;
    procedure InsereValoresBanco(Conta: string; Valor: real; Tipo: string);
    function BuscaIDCaixa(): string;
    procedure RealizaTransferencia(IDCaixa:string;ContaD: string; ContaO: string; IDContaDestino: string;
      IDContaOrigem: string; Valor: string);
    function BuscaValorConfiguracaoIDConta(Desc: string): string;
    procedure RealizaTransferenciaCaixa(IDConta: string; IDPlanoConta: string;
      IDUsuario: string; Valor: string; Tipo: string; IDCaixa: string);
    procedure RealizaTransferenciaConta(IDConta: string; IDPlanoConta: string;
      IDUsuario: string; Valor: string; Tipo: string);
    procedure AtualizaSaldoConta(IDConta:string;Tipo:string;Valor:string);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  ContaMovimentacaoData: TContaMovimentacaoData;

implementation

uses ConnectionDM, MainFm;

{ TContaMovimentacaoData }


procedure TContaMovimentacaoData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := ContaMovimentacaoZQuery;
end;

procedure TContaMovimentacaoData.OpenDataSet;
begin
  ConnectionData.EmptyQuery(ContaMovimentacaoZQuery, 'plano_conta_movimentacao');
end;

procedure TContaMovimentacaoData.CloseDataSet;
begin
  ContaMovimentacaoZQuery.Close();
end;

procedure TContaMovimentacaoData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(ContaMovimentacaoZQuery, Tabela, Condicoes);
end;

function TContaMovimentacaoData.BuscaData: string;
var
  Data: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Edit();
    Data := FieldByName('date').AsString;
    Result := Data;
  end;
end;

procedure TContaMovimentacaoData.InsereValoresBanco(Conta: string;
  Valor: real; Tipo: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE conta');
    if Tipo = 'D' then begin
      SQL.Add('SET saldo=saldo-:valor');
    end else begin
      SQL.Add('SET saldo=saldo+:valor');
    end;
    SQL.Add('WHERE id_conta=:id_conta');
    ParamByName('id_conta').AsString := Conta;
    ParamByName('valor').AsFloat := Valor;
    ExecSQL();
  end;
end;

function TContaMovimentacaoData.BuscaIDCaixa: string;
var
  IDCaixa: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select id_caixa_movimentacao from caixa_movimentacao where status=:status');
    ParamByName('status').AsString := 'A';
    Open();
    if RecordCount > 0 then begin
      IDCaixa := FieldByName('id_caixa_movimentacao').AsString;
      Result := IDCaixa;
    end else begin
      Result := '';
    end;
  end;
end;

procedure TContaMovimentacaoData.RealizaTransferencia(IDCaixa: string;
  ContaD: string; ContaO: string; IDContaDestino: string;
  IDContaOrigem: string; Valor: string);
var
  // Origem
  IDPlanoContaTO: string;
  // Destino
  IDPlanoContaTD: string;
begin
  IDPlanoContaTO := BuscaValorConfiguracaoIDConta('TRANSFERENCIA FEITA');
  IDPlanoContaTD := BuscaValorConfiguracaoIDConta('TRANSFERENCIA RECEBIDA');
  //Debitando da conta conta Origem
  if ContaO = 'CAIXA' then begin
    RealizaTransferenciaCaixa(IDContaOrigem, IDPlanoContaTO, IntToStr(
      MainForm.Usuario), Valor, 'D', IDCaixa);
  end else begin
    RealizaTransferenciaConta(IDContaOrigem, IDPlanoContaTO, IntToStr(
      MainForm.Usuario), Valor, 'D');
  end;
  if ContaD = 'CAIXA' then begin
    RealizaTransferenciaCaixa(IDContaDestino, IDPlanoContaTD, IntToStr(
      MainForm.Usuario), Valor, 'R', IDCaixa);
  end else begin
    RealizaTransferenciaConta(IDContaDestino, IDPlanoContaTD, IntToStr(
      MainForm.Usuario), Valor, 'R');
  end;
end;

procedure TContaMovimentacaoData.RealizaTransferenciaCaixa(IDConta: string;
  IDPlanoConta: string; IDUsuario: string; Valor: string; Tipo: string;
  IDCaixa: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO plano_conta_movimentacao(id_conta,id_plano_conta,id_usuario,valor,id_caixa_movimentacao)');
    SQL.Add('VALUES(:id_conta,:id_plano_conta,:id_usuario,:valor,:id_caixa_movimentacao);');
    ParamByName('id_conta').AsString := IDConta;
    ParamByName('id_plano_conta').AsString := IDPlanoConta;
    ParamByName('id_usuario').AsString := IDUsuario;
    ParamByName('valor').AsString := Valor;
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    ExecSQL();
  end;
   AtualizaSaldoConta(IDConta,Tipo,Valor);
end;

procedure TContaMovimentacaoData.RealizaTransferenciaConta(IDConta: string;
  IDPlanoConta: string; IDUsuario: string; Valor: string; Tipo: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO plano_conta_movimentacao(id_conta,id_plano_conta,id_usuario,valor)');
    SQL.Add('VALUES(:id_conta,:id_plano_conta,:id_usuario,:valor);');
    ParamByName('id_conta').AsString := IDConta;
    ParamByName('id_plano_conta').AsString := IDPlanoConta;
    ParamByName('id_usuario').AsString := IDUsuario;
    ParamByName('valor').AsString := Valor;
    ExecSQL();
  end;
    AtualizaSaldoConta(IDConta,Tipo,Valor);
end;

procedure TContaMovimentacaoData.AtualizaSaldoConta(IDConta: string;
  Tipo: string; Valor: string);
begin
   with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE conta');
    //Verifica se vai acrescentar ou diminuir na conta
    // Credito na conta - receita
    if Tipo = 'R' then begin
      SQL.Add('SET saldo=saldo+:valor_pago where id_conta=:id_conta');
    end else begin
      SQL.Add('SET saldo=saldo-:valor_pago where id_conta=:id_conta');
    end;
    ParamByName('id_conta').AsString := IDConta;
    ParamByName('valor_pago').AsString := Valor;
    ExecSQL();
  end;
end;

function TContaMovimentacaoData.BuscaValorConfiguracaoIDConta(Desc: string): string;
var
  VarDesc: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select valor from configuracao where desc_configuracao=:desc');
    ParamByName('desc').AsString := Desc;
    Open();
    if RecordCount > 0 then begin
      VarDesc := FieldByName('valor').AsString;
      Result := VarDesc;
    end else begin
      Result := '';
    end;
  end;
end;


initialization
  {$I contamovimentacaodm.lrs}

end.
